package com.atguigu.java;

import org.junit.Test;

import java.lang.annotation.Annotation;

/**
 * @author shkstart
 * @create 2021-02-23 9:25
 */
/*
 * 本章主要学习内容：
 *   注解的概述
 *   常见的Annotation实例
 *   自定义Annotation
 *   JDK中的元注解
 *   利用反射获取注解信息(在反射部分涉及)
 *   JDK8中注解的新特性
 *
 *  框架=注解+反射+设计模式
 * */

/*
 * 注解的使用
 *
 * 1.理解Annotation
 *   ①：JDK5.0新增的功能
 *
 *   ②：Annotation 其实就是代码里的特殊标记，这些标记可以在编译类加载，运行时被读取，并且
 * 程序员可以在不改变原有逻辑的情况下，在源文件中补充一些信息
 *
 *   ③：在javaSE中，注解的使用目的比较简单，例如标记过时的功能，忽略警告等
 *  在JavaEE和ANdiro中注解查娜拒了更重要的角色，例如用来配置应用程序的任何切，面，代替JAvaEE旧版中的所遗留的繁杂
 * 代码和xml配置等。
 *
 * 2。ANnocation的使用实例
 * 示例一：生成文档相关的注解
 * 示例二：在编译时进行格式检查(JDK内置的三个基本注解)
 *@Override：限定重写父类方法，该注解只能用于方法
 *@Deprecated：用于表示所修饰的元素(类，方法等)已过时、通常是因为所修饰的结构违宪或存在更好的选择
 *@SupperessWarnings：抑制编译器警告
 *
 * 示例三：跟踪代码依赖性，实现替代配置文件功能
 *
 *
 * 3.如何自定义注解：参照@SupperessWarnings定义
 *   ①：注解声明为@interface
 *   ②：内部定义成员，通常使用value表示
 *   ③：可以指定成员的默认值，使用default定义
 *   ④：如果自定义注解没有成员，表明    只是一个标识
 *
 * 如果注解有成员，再使用注解时，需要指定成员的值，如果有默认值就不用指定
 * 自定义注解必须配上注释的信息处理流程(使用反射)才有意义
 *
 * 4.jdk提供的4种元注解
 *   元注解：对现有的注解进行解释说明的注解
 *   自定义元注解一般都会指明两个元注解:Retention、Target
 *
 * Retention：指定所修饰的Annotation的生命周期： SOURCE、CLASS(默认行为)、RUNTIME
 *       只有声明为RUNTIME的注解才能通过反射获取
 * Target：用于指定被修饰的Annotation能用于修饰哪些程序元素
 * *******出现频率较低***********
 * Documented：表示所修饰的注解在被javadoc解析时，保留下来、
 * Inherited：被他修饰的Annotation将具有继承性
 *
 * 5、通过反射获取注解信息 ---反射讲解
 *
 * 6.注解的新特性 jdk8：可重复注解，类型注解
 * 6.1可重复注解 :①：在MyAnnotation上声明一个@Reperatable，成员值为Annotations.class
 *               ②：MyAnnotation的Target和Retention等元注解与Annotatopns相同
 *
 * 6.2类型注解：
 * ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如：泛型声明)
 * ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
 * */
public class Annoation {
    @Test
    public void test1() {
        Class clazz = Student.class;
        Annotation[] annotations = clazz.getAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            System.out.println(annotations[i]);

        }

    }

}
